﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Qtech.Reports.Atendimento.Services;
using CeA.Reports.Atendimento.DataAccess.DTO;
using CeA.Reports.Atendimento.Web.Helpers;
using CeA.Reports.Atendimento.Web.WebControls;

namespace CeA.Reports.Atendimento.Web.admin {
    public partial class usuariocadastro : System.Web.UI.Page {
        protected void Page_Init(object sender, EventArgs e)                {
            cmdPesquisarRoles.Click += new EventHandler(cmdPesquisarRoles_Click);
            
            cmdVoltar.Click += new EventHandler(cmdVoltar_Click);
            cmdSalvar.Click += new EventHandler(cmdSalvar_Click);
            cmdEditar.Click += new EventHandler(cmdEditar_Click);

            pesquisaRoles.Confirmar += new PesquisaRoles.ConfirmarEventHandler(pesquisaRoles_Confirmar);
        }


        protected void Page_Load(object sender, EventArgs e)                {
            if (PreviousPage != null) {
                this.CodigoUsuario = PreviousPage.CodigoUsuario;
                this.PageMode = PreviousPage.PageMode;
                carregar();
            }

            int id = 0;
            if (int.TryParse(Request["id"], out id) && !Page.IsPostBack) {
                this.CodigoUsuario = id;
                this.PageMode = "EDIT";

                carregar();
            }

            if (!Page.IsPostBack) {
                if (this.PageMode == "EDIT")
                    configEditMode(true);
                else
                    configEditMode(false);
            }


        }

        
        protected void cmdPesquisarRoles_Click(object sender, EventArgs e)  {
            pesquisaRoles.pop();
            pesquisaRoles.markSelected(this.SelectedRoles);
        }


        protected void cmdVoltar_Click(object sender, EventArgs e)          {
            NavigationHelper.RefererRedirect("/admin/usuario.aspx");
        }


        protected void cmdSalvar_Click(object sender, EventArgs e)          {
            try {
                if (this.CodigoUsuario > 0)
                    atualizar();
                else
                    inserir();

                configEditMode(false);
            }
            catch (InvalidOperationException ex) {
                MessageBox.pop(ex.Message);
            }
        }


        protected void cmdEditar_Click(object sender, EventArgs e)          {
            configEditMode(true);
        }


        private void carregar()                                             {
            int userId = this.CodigoUsuario;
            if (userId > 0) {
                UsuarioDTO ds = CadastroFacade.GetUsuario(userId);

                txtLogin.Text = ds.Login;
                txtSenha.Text = ds.Senha;
                chkContaBloqueada.Checked = (ds.ContaBloqueada == "S");
                txtNome.Text = ds.Detalhe.Nome;
                txtEmail.Text = ds.Detalhe.Email;
                txtDepartamento.Text = ds.Detalhe.Departamento;
                txtMatricula.Text = ds.Detalhe.NumeroFuncional;
                txtTelefone.Text = ds.Detalhe.Telefone;
                txtCelular.Text = ds.Detalhe.Celular;
                txtRoles.Text = ds.RolesToString().ToLower();

                this.SelectedRoles = ds.Roles;
            }
        }


        private void atualizar()                                            {
            UsuarioDTO dto = buildUsuarioDTO();
            dto.addRole(this.SelectedRoles);

            CadastroFacade.UpdateUsuario(dto);
            this.PageMode = "VIEW";
            MessageBox.pop("Registro atualizado com sucesso!");
        }


        private void inserir()                                              {
            UsuarioDTO dto = buildUsuarioDTO();
            dto.addRole(this.SelectedRoles);

            dto = CadastroFacade.SaveUsuario(dto);
            this.CodigoUsuario = dto.Id;
            this.PageMode = "VIEW";
            MessageBox.pop("Registro inserido com sucesso!");

        }


        private UsuarioDTO buildUsuarioDTO()                                {
            UsuarioDTO dto = new UsuarioDTO();
            dto.Id = this.CodigoUsuario;
            dto.Login = txtLogin.Text;
            dto.Senha = txtSenha.Text;
            dto.ContaBloqueada = chkContaBloqueada.Checked ? "S" : "N";
            dto.Detalhe.Id = this.CodigoUsuario;
            dto.Detalhe.Nome = txtNome.Text;
            dto.Detalhe.Email = txtEmail.Text;
            dto.Detalhe.Departamento = txtDepartamento.Text;
            dto.Detalhe.NumeroFuncional = txtMatricula.Text;
            dto.Detalhe.Telefone = txtTelefone.Text;
            dto.Detalhe.Celular = txtCelular.Text;

            return dto;
        }


        private void configEditMode(bool isEditMode)                        {
            
            foreach (Control c in pageContainer.Controls) {
                if (c is TextBox) {
                    if (!isEditMode) {
                        TextBox txt = (c as TextBox);
                        txt.CssClass = "text-field-ro";
                        txt.Enabled = false;
                    }
                    else {
                        TextBox txt = (c as TextBox);
                        txt.CssClass = "text-field";
                        txt.Enabled= true;
                    }
                }
            }

            loginRequired.Visible = !isEditMode;
            senhaRequired.Visible = !isEditMode;
            rfvLogin.Enabled = !isEditMode;
            rfvSenha.Enabled = !isEditMode;
            
            txtLogin.Enabled = false;
            txtLogin.CssClass = "text-field-ro";
            chkContaBloqueada.Enabled = isEditMode;
            cmdPesquisarRoles.Enabled = isEditMode;

            cmdSalvar.Visible = isEditMode;
            cmdEditar.Visible = !isEditMode;

            if (this.CodigoUsuario == 0) {
                loginRequired.Visible = true;
                senhaRequired.Visible = true;
                rfvLogin.Enabled = true;
                rfvSenha.Enabled = true;
                
                txtLogin.Enabled = true;
                txtLogin.CssClass = "text-field";
            }
        }


        #region -- PESQUISAS:  Event Handlers ---------------------------------

        protected void pesquisaRoles_Confirmar(object sender, PesquisaRolesEventArgs e) {
            this.SelectedRoles = e.SelectedRoles;
            txtRoles.Text = e.ToString().ToLower();
        }

        #endregion


        #region -- Page Properties --------------------------------------------


        public int CodigoUsuario            {
            get {
                if (ViewState["m_codigoUsuario"] != null)
                    return Convert.ToInt32(ViewState["m_codigoUsuario"]);
                return 0;
            }
            set {
                ViewState.Add("m_codigoUsuario", value);
            }
        }


        public List<RoleDTO> SelectedRoles  {
            get {
                if (ViewState["m_selectedRoles"] != null)
                    return (ViewState["m_selectedRoles"] as List<RoleDTO>);
                return new List<RoleDTO>();
            }
            set {
                ViewState.Add("m_selectedRoles", value);
            }
        }

        
        public string PageMode              {
            get {
                if (ViewState["m_pageMode"] != null)
                    return Convert.ToString(ViewState["m_pageMode"]);
                return "EDIT";
            }
            set {
                ViewState.Add("m_pageMode", value);
            }
        }


        #endregion
    }
}
